package cn.wzut.edut.service;

import cn.wzut.edut.dao.inf.Menu;
import cn.wzut.edut.dao.inf.Permission;
import cn.wzut.edut.dao.inf.Role;
import cn.wzut.edut.dao.pojo.table.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class RoleService {

    @Autowired
    Menu menu;

    @Autowired
    Role role;

    @Autowired
    Permission permission;

    /**
     * 创建角色
     * @param roleName
     * @param permissionIds
     * @param menuIds
     * @return
     */
    public boolean createRole(String roleName, String[] permissionIds, String[] menuIds){
        // 新增角色基本信息
        String roleId = role.insertSysRole(new SysRole(null, roleName));
        // 生成角色菜单关联列表
        List<SysRoleMenuRel> sysRoleMenuRelList = new ArrayList<>();
        for(String menuId : menuIds){
            sysRoleMenuRelList.add(new SysRoleMenuRel(null, roleId, menuId));
        }
        role.insertSysRoleMenuRelList(sysRoleMenuRelList);
        // 生成角色权限关联列表
        List<SysRolePermissionRel> SysRolePermissionRelList = new ArrayList<>();
        for(String permissionId : permissionIds){
            SysRolePermissionRelList.add(new SysRolePermissionRel(null, roleId, permissionId));
        }
        role.insertSysRolePermissionRelList(SysRolePermissionRelList);
        return true;
    }

    /**
     * 删除角色
     * @param roleIds
     * @return
     */
    public boolean delRole(String[] roleIds){
        List<String> role_id = Arrays.asList(roleIds);
        return role.delSysRoleList(role_id, null);
    }

    /**
     * 更新角色名
     * @param roleId
     * @param roleName
     * @return
     */
    public boolean updateRoleName(String roleId, String roleName){
        return role.updateRole(roleId, roleName);
    }

    /**
     * 更新角色所拥有菜单
     * @param roleId
     * @param delMenuIds
     * @param addMenuIds
     * @return
     */
    public boolean updateRoleMenuRel(String roleId, String[] delMenuIds, String[] addMenuIds){
        List<String> role_id = Arrays.asList(roleId);
        if(delMenuIds.length == 0) {
            List<String> menu_id = Arrays.asList(delMenuIds);
            // 删除菜单
            role.delSysRoleMenuList(null, role_id, menu_id);
        }
        if(addMenuIds.length == 0) {
            // 新增菜单
            List<SysRoleMenuRel> sysRoleMenuRelList = new ArrayList<>();
            for (String menuId : addMenuIds) {
                sysRoleMenuRelList.add(new SysRoleMenuRel(null, roleId, menuId));
            }
            role.insertSysRoleMenuRelList(sysRoleMenuRelList);
        }
        return true;
    }

    /**
     * 更新角色所拥有权限
     * @param roleId
     * @param delPermisssionIds
     * @param addPermisssionIds
     * @return
     */
    public boolean updateRolePermissionRel(String roleId, String[] delPermisssionIds, String[] addPermisssionIds){
        List<String> role_id = Arrays.asList(roleId);
        List<String> permission_id = Arrays.asList(delPermisssionIds);
        // 删除权限
        role.delSysRolePermissionList(null, role_id, permission_id);
        // 新增权限
        List<SysRolePermissionRel> SysRolePermissionRelList = new ArrayList<>();
        for(String permissionId : addPermisssionIds){
            SysRolePermissionRelList.add(new SysRolePermissionRel(null, roleId, permissionId));
        }
        role.insertSysRolePermissionRelList(SysRolePermissionRelList);
        return true;
    }

    /**
     * 获取角色分页列表
     * @param current
     * @param size
     * @return
     */
    public Map<String, Object> getRoleList(long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysRoleList", role.selectSysRolePage(null, null, current, size));
        data.put("sysRoleCount", role.countSysRole(null, null));
        return data;
    }

    /**
     * 根据角色名获取角色分页列表
     * @param current
     * @param size
     * @return
     */
    public Map<String, Object> getRoleListByName(String roleName, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysRoleList", role.selectSysRolePage(null, roleName, current, size));
        data.put("sysRoleCount", role.countSysRole(null, roleName));
        return data;
    }

    /**
     * 通过菜单查询角色分页列表
     * @param menuId
     * @param current
     * @param size
     * @return
     */
    public Map<String, Object> getRoleByMenu(String menuId, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysRoleList", role.selectRoleListByMenuPage(menuId, current, size));
        data.put("sysRoleCount", role.countSysRoleMenu(null, null, menuId));
        return data;
    }

    /**
     * 通过权限查询角色分页列表
     * @param permissionId
     * @param current
     * @param size
     * @return
     */
    public Map<String, Object> getRoleByPermission(String permissionId, long current, long size){
        //返回字典
        Map<String, Object> data = new HashMap<>();
        data.put("sysRoleList", role.selectRoleListByPermissionPage(permissionId, current, size));
        data.put("sysRoleCount", role.countSysRolePermission(null, null, permissionId));
        return data;
    }















//    /**
//     * 获取角色菜单
//     * @param token
//     * @return
//     */
//    public List<SysMenu> getMenuListByRole(String token, String role_id){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            //返回列表
//            return menu.selectSysMenuInRole(role_id);
//        }
//        throw new ServiceException(-1, "获取角色列表失败（无权调用）");
//    }
//
//    /**
//     * 更新角色菜单
//     * @param token
//     * @return
//     */
//    public boolean updateMenuListByRole(String token, RoleMenuRelModInfo roleMenuRelModInfo){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            String role_id = roleMenuRelModInfo.getRoleid();
//            for (String menu_id : roleMenuRelModInfo.getAdd_menu()) {
//                role.insertSysRoleMenuRel(role_id, menu_id);
//            }
//            for (String menu_id : roleMenuRelModInfo.getDel_menu()) {
//                role.delSysRoleMenu(role_id, menu_id);
//            }
//            return true;
//        }
//        throw new ServiceException(-1, "更新角色菜单失败（无权调用）");
//    }
//
//    /**
//     * 添加角色
//     * @param token
//     * @return
//     */
//    public boolean addRole(String token, RoleInfo roleInfo){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            role.insertSysRole(new SysRole("1", roleInfo.getRolename()));
//            return true;
//        }
//        throw new ServiceException(-1, "添加角色失败（无权调用）");
//    }
//
//
//
//    /**
//     * 获取角色列表
//     * @param token
//     * @return
//     */
//    public List<SysRole> getRoleList(String token, long current, long size){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            return role.selectAllSysRolePage(current, size);
//        }
//        throw new ServiceException(-1, "获取角色列表失败（无权调用）");
//    }
//
//    /**
//     * 获取角色权限
//     * @param token
//     * @return
//     */
//    public List<SysPermission> getPermissionByRole(String token, String roleid){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            return permission.selectPermissionInRoleId(roleid);
//        }
//        throw new ServiceException(-1, "获取角色权限列表失败（无权调用）");
//    }
//
//    /**
//     * 更新角色权限
//     * @param token
//     * @return
//     */
//    public boolean updatePermission(String token, String role_id, String del_permission[], String add_permission[]){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            for (String permission_id : add_permission) {
//                permission.insertSysRolePermissionRel(role_id, permission_id);
//            }
//            for (String permission_id : del_permission) {
//                permission.delSysRolePermission(role_id, permission_id);
//            }
//            return true;
//        }
//        throw new ServiceException(-1, "更新角色权限失败（无权调用）");
//    }
//
//    /**
//     * 更新角色信息
//     * @param token
//     * @return
//     */
//    public boolean updateInfo(String token, String id, String name){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断角色是否拥有该权限
//        if(true){
//            return role.updateRole(id, name);
//        }
//        throw new ServiceException(-1, "更新角色权限失败（无权调用）");
//    }

//    /**
//     * 获取全部角色列表
//     * @param token
//     * @return
//     */
//    public List<SysRole> getRoleList(String token){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if(clientService.selectRole(userId, "10")){
//                return role.selectAllSysRole();
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 获取指定个数指定页的角色列表
//     * @param token
//     * @return
//     */
//    public List<SysRole> getRoleListByPage(String token, int page, int num){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if(clientService.selectRole(userId, "10")){
//                //获取列表
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 查看单一角色信息
//     * @param token
//     * @return
//     */
//    public RoleInfo getRoleById(String token, String roleid){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if (clientService.selectRole(userId, "10")) {
//                // 获取用户表数据
//                SysRole sysRole = role.selectRole(roleid);
//                // 获取用户角色表数据
//                List<String> strings = role.selectSysRoleOnlyMenu(roleid);
//                String[] menuIds = strings.toArray(new String[strings.size()]);
//                return new RoleInfo(sysRole.getRoleName(),menuIds);
////                String end = "B";
////                for (String roleId : roleIds) {
////                    if (selectRole(userid, "3")) { // 判断是否拥有学生权限（学生表）
////                        end = "A";
////                        break;
////                    }
////                }
////                // 获取学生表/教师表数据
////                if(end.equals("A")){
////                    StuInf stuInf = information.selectPtyStu(userid);
////                    return new UserInfo("A", sysUser.getUser_name(), SysService.decrypt(sysUser.getHash_password())
////                            , sysUser.getReal_name(), stuInf.getStu_code(), stuInf.getSex(), stuInf.getPhone()
////                            , stuInf.getCollege_name(), roleIds, stuInf.getOpen_id(), stuInf.getClass_name());
////                }else{
////                    TcInf tcInf = information.selectPtyTeacher(userid);
////                    return new UserInfo("A", sysUser.getUser_name(), SysService.decrypt(sysUser.getHash_password())
////                            , sysUser.getReal_name(), tcInf.getTeacher_code(), null, tcInf.getPhone()
////                            , tcInf.getCollege_name(), roleIds, tcInf.getOpen_id(), null);
////                }
//            }
//        }
//        return null;
//    }
//
//
//
//
//    /**
//     * 添加角色
//     * @param token
//     * @return
//     */
//    public boolean addRole(String token, RoleInfo roleInfo){
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if(decode.getClaim("end").asString().equals("B")){
//
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if(clientService.selectRole(userId, "10")){
//                // 信息写入用户表
//                role.insertSysRole(new SysRole("1",roleInfo.getRole_name()));
//                // 信息写入用户角色关系表
//                String newRoleId = role.selectRoleInName(roleInfo.getRole_name()).getId();
//                for(String menuId : roleInfo.getMenuIds()){
//                    role.insertSysRoleMenuRel(new SysRoleMenuRel("1", newRoleId, menuId));
//                }
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 删除角色
//     * @param token
//     * @return
//     */
//    public boolean delRole(String token, String[] roleids) {
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if(clientService.selectRole(userId, "10")) {
//                for(String roleid : roleids){
//                    if(!role.delRole(roleid)){
//                        return false;
//                    }
//                }
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 修改角色
//     * @param token
//     * @return
//     */
//    public boolean modRole(String token, RoleModInfo roleModInfo) {
//        // 解析token
//        DecodedJWT decode = JWTUtils.decode(token);
//        // 判断是否是后台管理端发送的请求
//        if (decode.getClaim("end").asString().equals("B")) {
//            // 获取用户id
//            String userId = decode.getClaim("userid").asString();
//            // 判断用户是否拥有菜单10（角色管理）权限
//            if(clientService.selectRole(userId, "10")) {
//                // 更新用户表信息
//                role.updateSysRole(new SysRole(roleModInfo.getRoleid(), roleModInfo.getRole_name()));
//                // 添加用户角色关系表信息
//                if(roleModInfo.getAddMenu() != null) {
//                    for (String addMenuId : roleModInfo.getAddMenu()) {
//                        role.insertSysRoleMenuRel(new SysRoleMenuRel("1", roleModInfo.getRoleid(), addMenuId));
//                    }
//                }
//                // 删除用户角色关系表信息
//                if(roleModInfo.getDelMenu() != null) {
//                    for (String delMenuId : roleModInfo.getDelMenu()) {
//                        role.delSysRoleMenu(roleModInfo.getRoleid(), delMenuId);
//                    }
//                }
//                return true;
//            }
//        }
//        return false;
//    }

}
